/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ces31.ChineseDicesClient.RN;

import ces31.ChineseDicesClient.SO_SistemaCliente;
import ces31.ChineseDicesCommon.ClienteInterface;
import java.rmi.RemoteException;
import java.util.List;

/**
 *
 * @author Anderson Aiziro
 */
public class RN_Jogo extends RN_Jogo_Subject {

    public RN_Jogo(ClienteInterface myclient, String playername, String opponentname) {
        //this.inicializarJogo(myclient, playername, opponentname);
        ehPrimeiraRodada = true;
        setClienteInterface(myclient);
        setNomeJogador(playername);
        setNomeOponente(opponentname);
    }



//    private void inicializarJogo(ClienteInterface myclient, String playername, String opponentname) {
//        ehPrimeiraRodada = true;
//        setClienteInterface(myclient);
//        setNomeJogador(playername);
//        setNomeOponente(opponentname);
//    }

    /**
     * Caso de Uso: Enviar Afirmacao
     * Ator: Jogador
     * @param dicequantity
     * @param dicevalues
     * @throws java.rmi.RemoteException
     */
    public void encaminharAfirmacao(Integer dicequantity, Integer dicevalues) throws RemoteException {
        SO_SistemaCliente.getSalaDeEspera().getServidorInterface().encaminharAfirmacao(getClienteInterface(), dicequantity, dicevalues);
    }

    /**
     * Caso de Uso: Duvidar
     * Ator: Jogador
     * @throws java.rmi.RemoteException
     */
    public void encaminharDuvida() throws RemoteException {
        SO_SistemaCliente.getSalaDeEspera().getServidorInterface().finalizarRodada();
    }

    /**
     * Caso de Uso: Desistir do Jogo
     * Ator: Jogador
     * @throws java.rmi.RemoteException
     */
    public void encerrarJogo() throws RemoteException {
        SO_SistemaCliente.getSalaDeEspera().getServidorInterface().finalizarJogoPorDesistencia(clienteInterface);
    }


    public void atualizarInformacoesJogador(List<Integer> values, Integer quantity, String winner) {
        /*COMO MOSTRAR OS DADOS*/
        setValoresDosMeusDados(values);
        setQuantidadeDeDadosDoOponente(quantity);
        if (!ehPrimeiraRodada) {
            if (ehMeuTurno) {
                this.novaMensagem = nomeJogador + " Duvidou!\n\nO vencedor desta Rodada foi: " + winner + "\n\n Iniciando nova Rodada...\n" + winner + " joga primeiro!";
            } else {
                this.novaMensagem = nomeOponente + " Duvidou!\n\nO vencedor desta Rodada foi: " + winner + "\n\n Iniciando nova Rodada...\n" + winner + " joga primeiro!";
            }
            setEhMeuTurno(winner.equals(getNomeJogador()));
        }
        ehPrimeiraRodada = false;
        setQuantidadeMinimaDeDados(0);
        notifyNewBoardConfiguration();
        setEhPrimeiraAfirmacao(true);
    }

    public void apresentarAfirmacao(Integer quantity, Integer value) {
        setQuantidadeMinimaDeDados(quantity);
        if (ehMeuTurno) {
            this.novaMensagem = nomeJogador + ": Existem " + quantity.toString() + " dados de valor " + value.toString();
        } else {
            this.novaMensagem = nomeOponente + ": Existem " + quantity.toString() + " dados de valor " + value.toString();
        }
        //notifyNewMessageToObservers();
        notifyLastStatementToObservers();

        ehMeuTurno = false;
        setEhPrimeiraAfirmacao(false);
    }
    
    public void apresentarResultadoDoJogo(String name) {
        this.nomeVencedor = name;
        notifyEndOfGame();
    }
    
    public void habilitarJogada() {
      //  System.out.println("Chegou em SetMyTurn");
        this.ehMeuTurno = true;
        notifyTimeToPlay();
    }
    
    public String getNomeVencedor() {
        return nomeVencedor;
    }

    public boolean getEhPrimeiraAfirmacao() {
        return ehPrimeiraAfirmacao;
    }

    public void setEhPrimeiraAfirmacao(boolean isFirstMove) {
        this.ehPrimeiraAfirmacao = isFirstMove;
    }

    public boolean getEhMeuTurno() {
        return ehMeuTurno;
    }

    public void setEhMeuTurno(boolean ehMeuTurno) {
        this.ehMeuTurno = ehMeuTurno;
    }

    public String getQuantidadeMinimaDeDados() {
        return quantidadeMinimaDeDados.toString();
    }

    public void setQuantidadeMinimaDeDados(Integer controlquantityrule) {
        this.quantidadeMinimaDeDados = controlquantityrule + 1;
    }

    public String getNovaMensagem() {
        return novaMensagem;
    }

    public void setNovaMensagem(String mensagem){
        this.novaMensagem = mensagem;
    }

    public String getNomeJogador() {
        return nomeJogador;
    }

    public void setNomeJogador(String playername) {
        this.nomeJogador = playername;
    }

    public String getNomeOponente() {
        return nomeOponente;
    }

    public void setNomeOponente(String opponentname) {
        this.nomeOponente = opponentname;
    }
    
    public List<Integer> getValoresDosMeusDados() {
        return valoresDosMeusDados;
    }

    public void setValoresDosMeusDados(List<Integer> mydicevalues) {
        this.valoresDosMeusDados = mydicevalues;
    }

    public Integer getQuantidadeDeDadosDoOponente() {
        return quantidadeDeDadosDoOponente;
    }

    public void setQuantidadeDeDadosDoOponente(Integer opponentquantity) {
        this.quantidadeDeDadosDoOponente = opponentquantity;
    }

    public boolean getEhPrimeiraRodada() {
        return ehPrimeiraRodada;
    }

    public ClienteInterface getClienteInterface() {
        return clienteInterface;
    }

    public void setClienteInterface(ClienteInterface myclientinstance) {
        this.clienteInterface = myclientinstance;
    }


    public void setNomeVencedor(String nomeVencedor) {
        this.nomeVencedor = nomeVencedor;
    }

    private String nomeJogador;
    private String nomeOponente;
    private String novaMensagem;
    private Integer quantidadeMinimaDeDados = 0;
    private boolean ehMeuTurno;
    private String nomeVencedor;
    private List<Integer> valoresDosMeusDados;
    private Integer quantidadeDeDadosDoOponente;
    private ClienteInterface clienteInterface;
    private boolean ehPrimeiraRodada;
    private boolean ehPrimeiraAfirmacao;
}
